package cn.itsource.hrm.service.impl;

import cn.itsource.hrm.domain.Employee;
import cn.itsource.hrm.domain.Tenant;
import cn.itsource.hrm.exceptions.GlobalException;
import cn.itsource.hrm.mapper.EmployeeMapper;
import cn.itsource.hrm.mapper.MealMapper;
import cn.itsource.hrm.mapper.TenantMapper;
import cn.itsource.hrm.service.ITenantService;
import cn.itsource.hrm.util.StrUtils;
import cn.itsource.hrm.util.ValidUtils;

import cn.itsource.hrm.util.encrypt.MD5;
import cn.itsource.hrm.vo.TenantVo;
import com.baomidou.mybatisplus.service.impl.ServiceImpl;

import org.apache.commons.lang.time.DateUtils;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;



import java.util.Date;

/**
 * <p>
 *  服务实现类
 * </p>
 *
 * @author gangge
 * @since 2021-08-06
 */
@Service
public class TenantServiceImpl extends ServiceImpl<TenantMapper, Tenant> implements ITenantService {
@Autowired
private EmployeeMapper employeeMapper;
@Autowired
private MealMapper mealMapper;
    @Override
    public void entering(TenantVo tenantVo) {
        //机构入驻
        //System.out.println(tenantVo);
        Employee employee = tenantVo.getEmployee();
        Tenant tenant = tenantVo.getTenant();
        Long mealId = tenantVo.getMealId();
        //1.验证参数
        //1.1非空 公司名称不能为空
        final String companyName = tenant.getCompanyName();
        ValidUtils.assertNotNull(companyName, "公司名称不可以为空");
        ValidUtils.assertNotNull(tenant.getTenantTypeId(), "公司类别不可以为空");

        //  1.2 验证合法性 -- 邮箱合法性
        ValidUtils.assertEmail(employee.getEmail(), "邮箱格式不正确");
        ValidUtils.assertPhone(employee.getTel(), "手机号格式不正确");

        // 1.3 是否存在  -- 验证公司名不能重复
        final Tenant selectTenant = baseMapper.selectByCompanyName(companyName);
        ValidUtils.assertisNull(selectTenant, "公司名不可以重复！");

        //2. 保存数据
        //2.1 先保存机构，获取id
        // 如果前台没有传递属性，我们需要提供默认值
       // System.out.println(tenantVO);
        //  注册时间 registerTime=null
        // 审核状态 state=null
        final Date now = new Date();
        tenant.setRegisterTime(now);
        tenant.setState(0); // 覆盖初始状态
        baseMapper.insert(tenant);
        //2.2 在保存员工，密码，加盐加密
        // 获取uuid 随机字符串
        final String salt = StrUtils.getComplexRandomString(8);
        //  保存盐值
        employee.setSalt(salt);
        // 通过 md5（password，） 编码
        String password = employee.getPassword();
        employee.setPassword(MD5.getMD5(password+salt));
        employee.setInputTime(now);
        employee.setState(0);

        // 机构ID
        employee.setTenantId(tenant.getId());
        employee.setType(5); // 可以使用常量来标识
        employeeMapper.insert(employee);
        //2.3 保存套餐关系
        // 该机构的该套餐到期时间, 试用7天
        Date expireDate = DateUtils.addDays(now,7);
        mealMapper.addTenantMeal(mealId,tenant.getId(),expireDate);
    }

}
